package com.ruoyi.framework.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.SaTokenUtils;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Date;

/**
 * MyBatis-Plus 配置类（整合字段自动填充逻辑）
 *
 * @author Johnson
 */
@Configuration
public class MybatisPlusConfig {

    // ======================== MyBatis-Plus 核心插件配置 ========================
//    @Bean
//    public MybatisPlusInterceptor mybatisPlusInterceptor() {
//        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//        // 1. 乐观锁插件（解决并发更新问题,这个需要在表里面添加version字段才会生效，不需要的可以直接删除这个）
//        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
//        return interceptor;
//    }

    // ======================== 字段自动填充处理器（内部类实现） ========================
    @Bean
    public MetaObjectHandler fieldMetaObjectHandler() {
        return new MetaObjectHandler() {
            // 常量定义：字段名（与实体类属性保持一致）
            private final String CREATE_TIME = "createTime";
            private final String CREATE_BY = "createBy";
            private final String UPDATE_TIME = "updateTime";
            private final String UPDATE_BY = "updateBy";
            private final String DEL_FLAG = "delFlag";

            // 插入操作时自动填充
            @Override
            public void insertFill(MetaObject metaObject) {
                LoginUser loginUser = SaTokenUtils.getLoginUser();
                Date currentDate = new Date();

                // 填充创建者（登录用户名）
                strictInsertFill(metaObject, CREATE_BY, String.class, loginUser.getUsername());
                // 填充创建时间（当前时间）
                strictInsertFill(metaObject, CREATE_TIME, Date.class, currentDate);
                // 填充更新者（插入时与创建者一致）
                strictInsertFill(metaObject, UPDATE_BY, String.class, loginUser.getUsername());
                // 填充更新时间（插入时与创建时间一致）
                strictInsertFill(metaObject, UPDATE_TIME, Date.class, currentDate);
                // 填充删除标识（默认0：未删除）
                strictInsertFill(metaObject, DEL_FLAG, Integer.class, 0);
            }

            // 更新操作时自动填充
            @Override
            public void updateFill(MetaObject metaObject) {
                LoginUser loginUser = SaTokenUtils.getLoginUser();
                Date currentDate = new Date();

                // 填充更新者（当前登录用户名）
                strictUpdateFill(metaObject, UPDATE_BY, String.class, loginUser.getUsername());
                // 填充更新时间（当前时间）
                strictUpdateFill(metaObject, UPDATE_TIME, Date.class, currentDate);
            }
        };
    }
}